%% RSMA主函数 - 速率分割多址仿真
% 本程序模拟了速率分割多址技术，这是第六代移动通信(6G)中的候选多址接入技术
% 在RSMA中，用户消息被分割为公共部分和私有部分，通过公共流和私有流传输

clear all;
close all;
clc;

%% 参数设置
num_users = 2;           % 用户数量
num_tx_antennas = 4;     % 发射天线数量
num_rx_antennas = 2;     % 每个用户的接收天线数量
snr_dB = 20;             % 信噪比(dB)
modulation = 'QPSK';     % 调制方式
num_bits = 1000;         % 每个用户的比特数
common_ratio = 0.3;      % 分配给公共流的消息比例

fprintf('RSMA仿真 - %d用户, %d发射天线, %d接收天线\n', num_users, num_tx_antennas, num_rx_antennas);

%% 生成用户数据
user_bits = cell(1, num_users);
private_bits = cell(1, num_users);
common_bits = cell(1, num_users);

for u = 1:num_users
    % 生成随机比特
    user_bits{u} = randi([0 1], 1, num_bits);
    
    % 将用户消息分割为公共部分和私有部分
    [common_bits{u}, private_bits{u}] = split_message(user_bits{u}, common_ratio);
    
    fprintf('用户 %d: 总比特数=%d, 公共比特数=%d, 私有比特数=%d\n', ...
        u, length(user_bits{u}), length(common_bits{u}), length(private_bits{u}));
end

%% 调制用户数据
common_symbols = cell(1, num_users);
private_symbols = cell(1, num_users);

for u = 1:num_users
    % 调制公共比特和私有比特
    common_symbols{u} = modulate_symbols(common_bits{u}, modulation);
    private_symbols{u} = modulate_symbols(private_bits{u}, modulation);
end

%% 生成公共流
% 在RSMA中，所有用户的公共比特被编码成一个公共流
common_stream = combine_common_streams(common_symbols);

%% 生成信道矩阵
channel = generate_channel_matrix(num_users, num_tx_antennas, num_rx_antennas);

%% 设计预编码矩阵
% 在RSMA中，我们需要为公共流和每个用户的私有流设计预编码向量
% 这里采用简化的MMSE预编码策略
precoding_vectors = design_precoding(channel, num_users, num_tx_antennas, num_rx_antennas);

% 功率分配 - 公共流和私有流的功率分配
power_common = 0.5;  % 公共流功率比例
power_private = (1 - power_common) / num_users;  % 每个用户私有流功率比例

fprintf('功率分配: 公共流=%.2f, 每个私有流=%.2f\n', power_common, power_private);

%% 发送信号生成
% 生成发送信号 x = p_c*w_c*s_c + sum(p_k*w_k*s_k)
% 其中p是功率分配系数，w是预编码向量，s是符号流
transmitted_signal = generate_transmitted_signal(common_stream, private_symbols, ...
    precoding_vectors, power_common, power_private, num_tx_antennas);

%% 通过无线信道
received_signals = cell(1, num_users);

for u = 1:num_users
    % 应用信道
    received_signals{u} = apply_channel_rsma(transmitted_signal, channel{u}, snr_dB);
end

%% 接收端处理 - 采用连续解码策略
decoded_common_bits = cell(1, num_users);
decoded_private_bits = cell(1, num_users);
decoded_bits = cell(1, num_users);

for u = 1:num_users
    % 1. 首先解码公共流
    decoded_common_stream = decode_common_stream(received_signals{u}, channel{u}, ...
        precoding_vectors, power_common, power_private, u, num_users);
    
    % 从接收信号中减去公共流的贡献
    received_private = remove_common_stream(received_signals{u}, decoded_common_stream, ...
        channel{u}, precoding_vectors.common, power_common);
    
    % 2. 然后解码私有流
    decoded_private_stream = decode_private_stream(received_private, channel{u}, ...
        precoding_vectors, u, power_private);
    
    % 解调公共流和私有流
    [decoded_common_bits_all, ~] = decode_symbol(decoded_common_stream, modulation);
    [decoded_private_bits{u}, ~] = decode_symbol(decoded_private_stream, modulation);
    
    % 从公共流中提取属于该用户的部分
    common_length = length(common_bits{u});
    common_start = 1;
    for i = 1:u-1
        common_start = common_start + length(common_bits{i});
    end
    common_end = common_start + common_length - 1;
    decoded_common_bits{u} = decoded_common_bits_all(common_start:common_end);
    
    % 合并解码的公共比特和私有比特，重构原始消息
    decoded_bits{u} = reconstruct_message(decoded_common_bits{u}, decoded_private_bits{u}, common_ratio);
end

%% 计算误码率
ber = zeros(1, num_users);
for u = 1:num_users
    errors = sum(user_bits{u} ~= decoded_bits{u});
    ber(u) = errors / num_bits;
    
    fprintf('用户 %d 的误码率: %.6f\n', u, ber(u));
end

%% 绘制RSMA系统模型和性能结果
plot_rsma_results(user_bits, common_bits, private_bits, precoding_vectors, power_common, power_private, ber);

%% 比较RSMA与NOMA和SDMA的性能
compare_multiple_access_schemes(num_users, num_tx_antennas, snr_dB);

fprintf('RSMA仿真完成!\n'); 